package model;

import manager.IAnalizadorSintactico;
import manager.IToken;
import manager.ITokenStream;

public class B1  extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public B1 ( ITokenStream ts ) {
		super(ts, false);
	}
	public B1 ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/** 
	 * Devuelve true si reconoce un bloque de procedimientos y funciones
	 */
	public boolean reconocer () {
		
		boolean recognized = true;
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer B1:" );
		//----------------------------------------------
		
		/* <B1> ->  fin-func <EXP> ; <HEADER>|
		 			fin-proc; <HEADER> */
		
		// Reconoce Fin-Func
		if ( this.getTokenSiguiente().equals( new Token(IToken.PALABRA_RESERVADA_END_FUNC) ) ) {

			//  <B1> ->  fin-func <EXP> ; <HEADER>

			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<B1> ->  fin-func <EXP> ; <HEADER>", this.getTokenSiguiente() );
			//----------------------------------------------

			// Reconocer Palabra Reservada "fin-func"
			if ( !this.reconocerToken(IToken.PALABRA_RESERVADA_END_FUNC) ) {
				return false;
			}
			
			// Reconocer Expresion
			IAnalizadorSintactico expresion = new Expresion(this.tokenStream,this.debugMode);
		    recognized &= expresion.reconocer();
			
			// Reconocer punto y coma
			if ( !this.reconocerToken(IToken.TYPE_PUNTO_COMA) ) {
				return false;
			}
			
			// Reconocer Header
			while ( Header.primeros( this.getTokenSiguiente() ) ) {
				
				IAnalizadorSintactico header = new Header(this.tokenStream, this.debugMode);
				recognized &= header.reconocer();
			}
				
		} else if ( this.getTokenSiguiente().equals( new Token(IToken.PALABRA_RESERVADA_END_PROC) ) ) {

			/* <B1> ->  fin-proc; <HEADER> */
			
			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<B1> ->  fin-proc; <HEADER>", this.getTokenSiguiente() );
			//----------------------------------------------

			// Reconocer end-proc
			if ( !this.reconocerToken(IToken.PALABRA_RESERVADA_END_PROC) ) {
				return false;
			}
			
			// Reconocer punto y coma
			if ( !this.reconocerToken(IToken.TYPE_PUNTO_COMA) ) {
				return false;
			}
			
			// Reconocer <HEADER>
			while ( Header.primeros( this.getTokenSiguiente() ) ) {
				
				IAnalizadorSintactico header = new Header(this.tokenStream, this.debugMode);
				recognized &= header.reconocer();
			}
			
		}
		
		return recognized;
	}
	
	public static boolean primeros(IToken token) {
		return  token.equals( new Token(IToken.PALABRA_RESERVADA_END_PROC) ) ||
				token.equals( new Token(IToken.PALABRA_RESERVADA_END_FUNC) );
	}
}

